﻿using MubiSDK.LoggingLib.Core.Enum;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MubiSDK.LoggingLib.Core.Models
{
    /// <summary>
    /// <para>定义日志消息类</para>
    /// <para>用于中间存储一条日志消息所需的各项要素</para>
    /// </summary>
    public class LogMessage
    {
        /// <summary>
        /// 获取或设置本条日志所使用的时间类型（本地时间/UTC时间）
        /// </summary>
        public LogTimeType LogTimeType { get; set; }

        /// <summary>
        /// 获取或设置日志记录的具体时间点
        /// </summary>
        public DateTime LogTime { get; set; }

        /// <summary>
        /// 获取或设置记录日志时所在线程的托管ID
        /// </summary>
        public int ThreadID { get; set; }

        /// <summary>
        /// 获取或设置日志级别
        /// </summary>
        public LogLevel LogLevel { get; set; }

        /// <summary>
        /// 获取或设置产生此日志的日志器名称
        /// </summary>
        public string LoggerName { get; set; }

        /// <summary>
        /// 获取或设置记录日志的接口/方法名称
        /// </summary>
        public string MemberName { get; set; }

        /// <summary>
        /// 获取或设置记录日志的源代码文件名（不包含完整路径）
        /// </summary>
        public string FileName { get; set; }

        /// <summary>
        /// 获取或设置记录日志的代码行号
        /// </summary>
        public int LineNumber { get; set; }

        /// <summary>
        /// 获取或设置日志消息的主体内容
        /// </summary>
        public string Payload { get; set; }

        /// <summary>
        /// 使用指定的参数初始化<see cref="LogMessage"/>类的新实例。
        /// </summary>
        /// <param name="logTimeType">指示使用本地时间还是UTC时间生成日志时间戳。</param>
        /// <param name="loggerName">产生此日志的日志器名称。</param>
        /// <param name="memberName">记录日志的接口或方法名称。</param>
        /// <param name="fileName">记录日志的源代码文件名。</param>
        /// <param name="lineNumber">记录日志的代码行号。</param>
        /// <param name="payload">日志消息的正文内容。</param>
        public LogMessage(LogTimeType logTimeType, LogLevel logLevel, string loggerName, string memberName, string fileName, int lineNumber, string payload)
        {
            // 必须由外部传入进行设置
            LogTimeType = logTimeType;
            LogLevel = logLevel;
            LoggerName = loggerName ?? string.Empty;
            MemberName = memberName ?? string.Empty;
            FileName = fileName ?? string.Empty;
            LineNumber = lineNumber;
            Payload = payload ?? string.Empty;

            // 根据时间类型自动生成时间戳
            LogTime = (logTimeType == LogTimeType.LocalTime) ? DateTime.Now : DateTime.UtcNow;
            // 自动捕获当前线程ID
            ThreadID = Environment.CurrentManagedThreadId;
        }

    }
}
